package 剑指offer;

import java.util.Arrays;

import org.junit.Test;


public class _60n个骰子的点数 {
	@Test
	public void test() {
		System.out.println(Arrays.toString(dicesProbability(2)));
	}
	/**
	 * 
	 *@time 2021年3月25日下午8:49:12
	 * 
	 *@param n
	 *@return double[]
	 *
	 *@see
	 *当骰子为n时 有种数有6n-n+1=5n+1，
	 *设n-1个 骰子的解为f(n-1)则n个骰子的和为x的解为f(n,x)
	 *当第n个骰子为1时，n-1个骰子的和应该为x-1
	 *			.
	 *			.
	 *			.
	 *可以推导出f(n,x)= 求和(1-6)的变量设置为i   : f(n,x-i)/6	
	 */
    public double[] dicesProbability(int n) {
	 double []dp = new double[6];
	 Arrays.fill(dp, 1.0/6.0);
    	for (int i = 2; i <= n; i++) {
			double []tmp = new double[5*i+1];
			for (int j = 0; j < dp.length; j++) {
				//这里是将前面得到(1-6的i的值)的 f(n-1,x-i)/6.0的求和
				for (int k = 0; k < 6; k++) {
					tmp[j+k] += dp[j]/6.0;
				}
			}
			dp = tmp;
		}
    	
    	return dp;

    }

}
